home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 101-125 / 105 / pere-et-fils / readme_francais < prev    next >
Text File  |  1995-03-13  |  6KB  |  149 lines

  1. ************************************************************************
  2.  
  3.            Ces fichiers sur les process et code reentrant doivent
  4.         etre distribues gratuitement a tout le monde.
  5.  
  6.  
  7.            Distribuez tous les fichiers ensemble sinon ce serait
  8.         inutilisable.
  9.  
  10.  
  11.  
  12.            Lancement de cette demo:
  13.  
  14.                 CD ladirectorydecesfichiers
  15.                 Pere Fils n   (n est le nombre de process que vous voulez)
  16.                           essayez 4 ou 15 ou 36 ou 300 si vous avez des Megs
  17.  
  18.            Pour arreter tout ca:
  19.  
  20.                 - ecrire 'logoff' (sans les ') dans chaque fenetre
  21.                 - le pere s'arrete tout seul apres le dernier fils
  22.  
  23.  
  24.  
  25.            Pour compiler:
  26.  
  27.                 Prendre un Lattice,
  28.  
  29.                 LC1 -iINCLUDE: Pere
  30.                 LC2 -v Pere
  31.                 BLink FROM LIB:AStartup.obj+Pere.o TO Pere LIBRARY LIB:Amiga.lib+LC.lib VERBOSE NODEBUG
  32.  
  33.                 LC1 -iINCLUDE: Fils
  34.                 LC2 -v Fils
  35.                 BLink FROM LIB:StartProc.obj+Fils.o TO Fils LIBRARY LIB:Amiga.lib VERBOSE NODEBUG
  36.  
  37.  
  38.  
  39.         Comment ca fonctionne ?
  40.  
  41.            Le pere charge le code en memoire, puis lance autant de process
  42.         que l'on veut dessus. Le code est comme un corps inerte, le process
  43.         est l'etincelle qui le fait vivre.
  44.  
  45.            Le pere ouvre 2 ports. Son process en a deja un que l'on peut
  46.         trouver (voir au debut du fils) mais on ne l'utilise pas, car le
  47.         DOS cause avec lui, et le seul truc qu'on peut avoir est un gourou
  48.         (87000004 = unexpected reveived packet).
  49.            Le 1er port sert a initialiser les fils et recevoir leur reponse
  50.         qui est soit OK soit un code erreur. Le pere change alors le 
  51.         "reply port" dans son message et entame le dialogue avec le fils
  52.         qui lui repondra donc sur le 2eme port.
  53.            Le pere peut ensuite creer un autre message et initialiser un 
  54.         autre fils en se servant du premier port.
  55.  
  56.            Chaque fils detecte le message d'initialisation sur le port de
  57.         son process. Il se cree ensuite un port suplementaire et ne se 
  58.         servira plus de celui du process (dans la structure Process). Avant
  59.         de repondre OK au pere, il place l'adresse du port qu'il a cree
  60.         dans le message qu'il retourne au pere (ReplyMsg) pour que celui-ci
  61.         sache a qui il s'adresse.
  62.            Comme il y a un message par fils, chaque message a en lui l'adresse
  63.         du port du fils qui l'a utilise. le pere n'a qu'a regarder qui lui
  64.         a ecris pour savoir a qui ecrire.
  65.  
  66.            Les fils se comportent comme des terminaux, et le code qui les
  67.         gere est dans le pere. Il suffirait par exemple de faire memoriser
  68.         au pere les ports de tous ses fils, et de rajouter un peu de code,
  69.         pour avoir un serveur multivoies sur un ecran Amiga...
  70.            Si vous faites ca, n'utilisez pas des tableaux pour memoriser,
  71.         car ca limite le nombre de fils a la taille du tableau, mais
  72.         utilisez plutot les fonction de LIST de l'EXEC, qui sont tres
  73.         pratiques. Notez qu'elles permettent meme de faire des arborescences
  74.         en definissant des NODES dans des listes triees (par l'Exec) en 
  75.         tant que HEADER d'autre listes...
  76.  
  77.  
  78.         Le startproc.obj:
  79.  
  80.            C'est un astartup.obj modifie pour permettre de faire du code
  81.         reentrant. Certains diront qu'il n'y a qu'a enlever le startup, et
  82.         de terminer les process avec des RemTask(), mais c'est se priver
  83.         de 2 choses:
  84.  
  85.              -  la fonction exit() qui permet de terminer le process a 
  86.               n'importe quel endroit du code, meme dans la 30eme fonction
  87.               imbriquee, car elle repositionne le pointeur de pile de ce 
  88.               process avant de faire un RTS pour sortir definitivement.
  89.  
  90.              -  la possibilite de faire faire des AllocMem() par un process
  91.               car chaque fils doit desallouer la memoire qu'il a emprumte
  92.               au systeme avant de se terminer, ce que RemTask ne permet pas.
  93.  
  94.            D'ou une possibilite interressante: il est fastidieux pour faire
  95.         du reentrant de devoir passer toutes les variable sous forme de
  96.         parametre, et de n'en avoir aucune de GLOBALE ni de STATIQUE. Une
  97.         alternative simple pour ne pas reecrire tous vos programmes est la
  98.         technique utilisee dans le fils, qui consiste a definir une structure
  99.         comportant toutes vos variables globales, et de faire une allocation
  100.         memoire a l'image de cette structure. Il ne reste plus qu'un seul
  101.         parametre a passer entre toutes les fonctions: l'adresse du bloc
  102.         memoire ou elles vont pouvoir ecrire et lire a loisir car il y aura
  103.         un bloc alloue par process.
  104.            En faisant communiquer les process entre eux par leur ports, il
  105.         serait meme possible qu'ils accedent tous a un meme ensemble de 
  106.         donnees... Mais la il ne faut pas que l'un ecrive pendant que
  107.         l'autre lise, sinon SCRATCH!   Il existe 2 solutions: quand un 
  108.         process ecrit dans une telle zone partagee, il peut faire Forbid()
  109.         avant et Permit() apres, ou utiliser les Semaphores de l'Exec qui
  110.         permettraient aux process de se synchroniser en bloquant puis 
  111.         liberant la zone a tour de role.
  112.  
  113.  
  114.  
  115.            Amusez-vous bien, c'est magique de voir qu'une seule instruction
  116.         d'ouverture de fenetre permet d'en ouvrir des tas !
  117.  
  118.  
  119.         -------------------------------------------------------------------
  120.  
  121.  
  122.  
  123.  
  124.         Vous pouvez distribuer ces fichiers a condition que ce soit tous
  125.         ensemble:
  126.  
  127.                 proc.h          le fichier include (structure message)
  128.                 Pere.c          le source
  129.                 Fils.c          le source
  130.                 StartProc.asm   le source
  131.                 Pere            l'executable
  132.                 Fils            l'executable
  133.                 StartProc.obj   l'executable
  134.                 README          ces explications
  135.  
  136.  
  137.         Vous pouvez aussi les traduire en anglais (mieux que moi) pour
  138.         les envoyer a Fred FISH.
  139.  
  140.  
  141.  
  142.         Si amelioration et desir de partager, laisser un message a:
  143.  
  144.         Jean-Michel FORGEAS, le SYSOP de FLam avec Alex LIVSHITS, 
  145.  
  146.         ou bien:
  147.  
  148.         SYSOP, Serveur FLam, Tel: 47-58-76-15 (France)
  149.